﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Linq;

using Microsoft.Practices.Unity;

using Arquitetura.Architectural.Model;
using Arquitetura.Architectural.DataLayer;
using Arquitetura.Model;

namespace Arquitetura.DataLayer
{
    public class UsuarioRepository : Repository<ArquiteturaModelContainer>, IUsuarioRepository
    {
        #region Propriedade(s)
        protected override string EntitySetName
        {
            get { return "UsuarioSet"; }
        }

        private ObjectQuery<Usuario> UsuarioSet
        {
            get
            {
                return ObjectQuerySelectFactory<Usuario>();
            }
        }
        #endregion Propriedade(s)

        #region Construtor(es)
        public UsuarioRepository()
            : this(new ArquiteturaModelContainer()) { }

        [InjectionConstructor]
        public UsuarioRepository(ArquiteturaModelContainer arquiteturaModelContainer)
            : base(arquiteturaModelContainer) { }
        #endregion Construtor(es)

        #region Método(s)
        public Result<IQueryable<Usuario>> Select()
        {
            try
            {
                return new Result<IQueryable<Usuario>>(UsuarioSet);
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Usuario>>(ex);
            }
        }

        public Result<IQueryable<Usuario>> Select(IEnumerable<string> attributosEntidadeIncluidos)
        {
            try
            {
                return new Result<IQueryable<Usuario>>(
                    UsuarioSet.Include(attributosEntidadeIncluidos));
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Usuario>>(ex);
            }
        }

        public Result Insert(Usuario usuario)
        {
            try
            {
                if (usuario.UsuarioCarimbo != null)
                {
                    usuario.UsuarioCarimbo.EntityKey = CreateEntityKey(usuario.UsuarioCarimbo);
                }

                InsertEntity(usuario);

                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result Update(Usuario usuario)
        {
            try
            {
                if (usuario.UsuarioCarimbo != null)
                {
                    usuario.UsuarioCarimbo.EntityKey = CreateEntityKey(usuario.UsuarioCarimbo);
                }

                UpdateEntity(usuario);

                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result Delete(Usuario usuario)
        {
            try
            {
                if (usuario.UsuarioCarimbo != null)
                {
                    usuario.UsuarioCarimbo.EntityKey = CreateEntityKey(usuario.UsuarioCarimbo);
                }

                DeleteEntity(usuario);

                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }
        #endregion Método(s)
    }
}
